package com.x.core.wrapper.gis;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKBReader;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.OTHER)
public class PointTypeHandler extends BaseTypeHandler<String> {

    // 将 WKT 字符串转换为数据库 POINT 类型
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, "ST_GeomFromText('" + parameter + "')");
    }

    // 从结果集中读取 POINT 并转为 WKT 字符串
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Object value = rs.getObject(columnName);
        return value != null ? convertToWKT(value) : null;
    }

    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        Object value = resultSet.getObject(i);
        return value != null ? convertToWKT(value) : null;
    }

    @Override
    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        Object value = callableStatement.getObject(i);
        return value != null ? convertToWKT(value) : null;
    }

    // 其他重写方法（略）...

    // 将数据库二进制或字符串转换为 WKT
    private String convertToWKT(Object value) {
        if (value instanceof byte[]) {
            // 解析 MySQL 的二进制格式（如使用 JTS）
            try {
                WKBReader reader = new WKBReader();
                Geometry geometry = reader.read((byte[]) value);
                return geometry.toText();
            } catch (ParseException e) {
                throw new RuntimeException("Failed to parse geometry", e);
            }
        } else if (value instanceof String) {
            // 直接返回字符串（如已经是 WKT）
            return (String) value;
        }
        return null;
    }
}